﻿using System;
using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;

namespace ProgramacionAsincrona.Trabajos2
{
    public partial class FormPrueba : Form
    {
        public FormPrueba()
        {
            InitializeComponent();
        }

        private void btnIniciar_Click(object sender, EventArgs e)
        {
            var TrabajoPrueba = new BackgroundWorker()
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true
            };

            TrabajoPrueba.DoWork += RealizarTrabajo;                // Método que hará el trabajo
            TrabajoPrueba.ProgressChanged += NotificarProgreso;     // Método donde se notificará el progreso
            TrabajoPrueba.RunWorkerCompleted += TrabajoCompletado;  // Método que se ejecutará al finalizar el trabajo

            TrabajoPrueba.RunWorkerAsync();                         // Se manda a iniciar el trabajo, de forma asíncrona (segundo plano)
        }

        public void RealizarTrabajo(object sender, DoWorkEventArgs e)
        {
            // Cuando se inicia el trabajo, hacer lo siguiente:
            var TotalTareas = 5;                                             // Establecemos el total de tareas a realizar
            var ListaTareas = Enumerable.Range(1, TotalTareas).ToList();     // Simulamos las tareas en una lista

            this.Invoke((MethodInvoker)delegate()
            {
                this.lstEventos.Items.Add("Se inicia el Trabajo de prueba");     // Mensaje de inicio de Trabajo
            });

            foreach (var ProgresoTareas in ListaTareas)                      // El progreso del trabajo irá del 1 al total de tareas
            {
                System.Threading.Thread.Sleep(1500);                         // Una pequeña pausa que simula la tarea. además de poder ver el efecto de progreso en la ventana
                ((BackgroundWorker)sender).ReportProgress((int)(ProgresoTareas * 100d / TotalTareas));  // Al finalizar cada tarea, reportamos el progreso (Porcentaje, valor entero del 1 al 100)
            }
        }

        public void NotificarProgreso(object sender, ProgressChangedEventArgs e)
        {
            // Cada vez que se notifica un progreso, hacer lo siguiente:
            this.lstEventos.Items.Add(string.Format("Se completó el Trabajo de prueba al {0}%", e.ProgressPercentage.ToString()));
        }

        public void TrabajoCompletado(object sender, RunWorkerCompletedEventArgs e)
        {
            // Si terminó el trabajo (finalización, cancelación, error), hacer lo siguiente:
            this.lstEventos.Items.Add("Finaliza el Trabajo de prueba");
        }
    }
}
